package com.lvy.hczn.front.business.service;

import com.lvy.hczn.front.system.domain.business.UpOrDownPolicy;
import com.lvy.hczn.front.system.domain.business.WcsData;
import com.lvy.hczn.front.system.domain.business.WcsResponse;
import com.lvy.hczn.front.business.dto.MessageInfo;
import com.lvy.hczn.front.business.dto.Param;
import com.lvy.hczn.front.business.util.ResultUtil;

public interface WcsService {

    /**
     * 发送消息到wcs
     *
     * @param param
     * @param upOrDownPolicy 指令参数
     * @return
     * @author yw
     * @date 2022-03-20 15:12:58
     */
    void sendMessage(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 二次扫码入库
     * 扫描仓库号，货箱编号，确定入当前库，默认topic为MQ2_WMS_TO_WCS
     * 参数为WMS二次扫码,获得货架编号+货箱编码
     *
     * @param response
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-03-20 15:17:25
     */
    void stockInBySecondScan(WcsResponse response, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * wms，wcs数据转换
     *
     * @param data
     * @param toWcs
     * @param num
     * @return
     * @author yw
     * @date 2022-03-22 15:41:31
     */
    WcsData convertData(WcsData data, boolean toWcs, int num);

    /**
     * 根据出库单取货出库
     *
     * @param code
     * @return
     * @author yw
     * @date 2022-03-22 21:02:29
     */
//    void outboundOrderByCode(String code, UpOrDownPolicy upOrDownPolicy) throws InterruptedException;

    /**
     * 分拣原料入库
     *
     * @param param
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-04-19 22:48:49
     */
    void sortingEntry(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 合箱原料入库
     *
     * @param param
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-04-19 22:48:49
     */
    void mergeEntry(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 请求分拣出库
     *
     * @param param
     * @return
     * @author yw
     * @date 2022-04-19 22:48:49
     */
    void sortingOut(Param param) throws Exception;

    /**
     * 连续发指令到wcs,即一个指令响应成功后发送第二个指令，wcs暂时不支持一次性发全部指令
     *
     * @param param
     * @return
     * @author yw
     * @date 2022-04-19 22:48:49
     */
    void sortingOutBatch(Param param, boolean leaveInBuffer) throws Exception;

    /**
     * @Description 查询一遍有没有，没有在set
     * @Param [upOrDownPolicy]
     * @Author yw
     * @Date 2024/6/1 11:13
     * @Return void
     **/
    void checkRedisExist(UpOrDownPolicy upOrDownPolicy);

    /**
     * 分拣订单入库
     *
     * @param param
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-04-19 22:48:23
     */
    void sortingOrderEntry(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 空箱入库
     *
     * @param param
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-04-19 22:49:24
     */
    void emptyEntry(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 合箱空箱入库
     *
     * @param param
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-04-19 22:49:24
     */
    void emptyEntryOfMerge(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 原料箱入库
     * 不同的入库展开不同的方法，流程写在服务端，不写在web端
     *
     * @param param
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-04-19 22:49:50
     */
    void productEntry(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 强制入库,入货箱重量与称重不匹配
     *
     * @param param
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-04-19 22:50:23
     */
    void entryForceInfo(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 货箱净重称重
     *
     * @param param
     * @return
     * @author yw
     * @date 2022-04-07 20:20:51
     */
    void netWeightInit(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 出库且不入库，根据属性outbound区分货箱类型
     *
     * @param param
     * @param outboundType 货箱出库不入库,1、空箱；2、非空箱出库且不入库；3、非空箱出库
     * @param type         出库单类型：1、订单出库；2、退贷出库；3、空箱出库；4、原料箱出库
     * @return
     * @author yw
     * @date 2022-04-07 20:20:51
     */
    void notEntry(Param param, Integer outboundType, Integer type) throws Exception;

    /**
     * 采购空箱出库且入库，根据属性outbound区分货箱类型
     *
     * @param param
     * @param outboundType 货箱出库不入库,1、空箱；2、非空箱出库且不入库；3、非空箱出库
     * @param type         出库单类型：1、订单出库；2、退贷出库；3、空箱出库；4、原料箱出库
     * @return
     * @author yw
     * @date 2022-04-07 20:20:51
     */
    void purchaseEmptyDown(Param param, Integer outboundType, Integer type) throws Exception;

    /**
     * 分拣中称重
     *
     * @param param
     * @return
     * @author yw
     * @date 2022-04-07 20:20:51
     */
    ResultUtil sortingWeightInfo(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 采购入库称重
     *
     * @param param
     * @param upOrDownPolicy
     * @throws Exception
     */
    void entryWeight(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * wcs返回状态到前端或者浏览器重新打开进入对应页面，则调此方法获取wcs返回信息
     *
     * @param type
     * @param clientId
     * @return com.lvy.hczn.common.core.util.ResultUtil
     * @author yw
     * @date 2022-05-20 17:22:35
     */
    MessageInfo selectResponseFromWcs(String type, String clientId, String processType) throws Exception;

    /**
     * 销售退货入库
     *
     * @param param
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-04-19 22:48:49
     */
    void returnEntry(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    /**
     * 临期报损入库
     *
     * @param param
     * @param upOrDownPolicy
     * @return
     * @author yw
     * @date 2022-04-19 22:48:49
     */
    void frmLossEntry(Param param, UpOrDownPolicy upOrDownPolicy) throws Exception;

    void stackBoxesPercent(String percent) throws Exception;

    /**
     * 箱子放到缓存位自动扫描入库，根据进入的页面进行判断入库的货箱类型
     *
     * 1、WMS操作人员进入对应的操作页面
     * 2、redis缓存页面操作类型以及仓库编号
     * 3、WCS反馈仓库和货箱编号
     * 4、跟WCS的反馈，从Redis查询对应的页面操作
     * 5、返回页面获取数据执行指令
     *
     * @param response
     * @return
     * @author yw
     * @date 2022-04-19 22:48:49
     */
    void entryByPageType(WcsResponse response);

    /**
     * @Description 延时发送到WCS
     * @Param
     * @Author yw
     * @Date 2024/6/5 15:08
     * @Return
     **/
    void sendDelay() throws Exception;
}